home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / comms / other / amarquee / examples / amarqueesocketdebug.c < prev    next >
C/C++ Source or Header  |  1999-05-25  |  4KB  |  139 lines

  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #include <dos/dos.h>
  7. #include <clib/dos_protos.h>
  8. #include <clib/exec_protos.h>
  9.  
  10. #include <clib/AMarquee_protos.h>
  11.  
  12. #include <pragmas/AMarquee_pragmas.h>
  13. #define ASYNC_CONNECT
  14.  
  15. struct Library * AMarqueeBase = NULL;
  16. struct QSession * session     = NULL;
  17.  
  18. /* Takes user input until blank line is typed */
  19. void ProcessDebugCommands(struct QSession * session)
  20. {
  21.   while(1)
  22.   {
  23.     char debugline[500] = "\0\0\0\0\0\0\0\0";
  24.     char * keyword, * data;
  25.     ULONG dataLen = 0L;
  26.     LONG res;
  27.     
  28.     printf("Enter your debug command now: "); fflush(stdout);
  29.     gets(debugline);
  30.   
  31.     keyword = &debugline[2];
  32.     if (data = strchr(keyword,'='))
  33.     {
  34.       *data = '\0';  /* terminate the keyword */
  35.       data++;
  36.       dataLen = strlen(data)+1;
  37.     }
  38.     else {
  39.      strcpy(keyword+strlen(keyword),"\n");
  40.      dataLen=strlen(keyword)+1;
  41.     }
  42.     switch((int)(debugline[0]))
  43.     {
  44.       case '\0': res=QGo(session,0L);                           break;
  45.       case 's':  res=QSendRawOp(session, keyword, dataLen-1); break;
  46.       default:   printf("Command code %c was not recognized.\n",debugline[0]); break;
  47.     }
  48.     printf("(Op result was %i)\n",res);
  49.     if (debugline[0] == '\0') return;
  50.   }
  51. }
  52.  
  53.  
  54. void CleanExit(void)
  55. {
  56. printf("\nCleaning up...\n");
  57.   if (session)      QFreeSession(session);        /* This MUST be done before we close the library! */
  58.   if (AMarqueeBase) CloseLibrary(AMarqueeBase);  
  59.   printf("All done.\n");
  60. }
  61.  
  62. /* Main program */
  63. int main(int argc, char ** argv)
  64. {
  65.   char * connectTo;
  66.   int port;
  67.      
  68.   printf("Usage Note:  AMarqueeSocketDebug [hostname=localhost] [port=7]\n");  
  69.   atexit(CleanExit);
  70.   
  71.   connectTo = (argc>1) ? argv[1] : "localhost";
  72.   port      = (argc>2) ? atoi(argv[2]) : 7;
  73.  
  74.   if ((AMarqueeBase = OpenLibrary("amarquee.library",49L)) == NULL)
  75.   {
  76.      printf("Couldn't open amarquee.library v49!\n");
  77.      exit(RETURN_ERROR);
  78.   }
  79.   printf("Connecting to %s:%i\n",connectTo, port);
  80.  
  81. #ifdef ASYNC_CONNECT
  82.   if ((session = QNewSocketSessionAsync(connectTo, port,NULL)) == NULL)
  83.   {
  84.      printf("Couldn't connect to server %s:%i\n",connectTo, port);
  85.      exit(RETURN_WARN);
  86.   }
  87. #else
  88.   if ((session = QNewSocketSession(connectTo, port,NULL)) == NULL)
  89.   {
  90.      printf("Couldn't connect to server %s:%i\n",connectTo, port);
  91.      exit(RETURN_WARN);
  92.   }
  93. #endif
  94.  
  95.   printf("Connected to server %s:%i\n",connectTo, port);
  96.  
  97.   printf("Commands are:\n");
  98.   printf("\n");
  99.   printf("s data           Send data to the remote host\n");
  100.   printf("<enter>          Send accumulated transactions (GO!!)\n");
  101.   printf("\n");
  102.   printf("Press CTRL-F to enter commands, or CTRL-C to quit\n");
  103.   
  104.   while(1)
  105.   {
  106.      struct QMessage * qMsg;
  107.      ULONG signals = (1L << session->qMsgPort->mp_SigBit) | (SIGBREAKF_CTRL_C) | (SIGBREAKF_CTRL_F);
  108.  
  109.      /* Wait for next message from the server */
  110.      signals = Wait(signals);
  111.      
  112.      if (signals & (1L << session->qMsgPort->mp_SigBit))
  113.      {
  114.         while(qMsg = (struct QMessage *) GetMsg(session->qMsgPort))
  115.         {
  116.           /* Handle message */
  117.           printf("Message %p recieved---------\n",qMsg);
  118.           printf("Status:       %i (%s)\n",  qMsg->qm_Status, QErrorName(qMsg->qm_Status));
  119.           printf("Error Line:   %i\n",  qMsg->qm_ErrorLine);
  120.           printf("Message ID:   %i\n",  qMsg->qm_ID);
  121.           printf("Path:        [%s]\n", qMsg->qm_Path?qMsg->qm_Path:"<NULL>");
  122.           if (qMsg->qm_Data) {
  123.                 char *gh=(char *)qMsg->qm_Data;
  124.                 gh[qMsg->qm_DataLen-1]=0;
  125.           }
  126.  
  127.           printf("Data:        [%s](int=%i)\n", qMsg->qm_Data?qMsg->qm_Data:((UBYTE*)"<NULL>"),qMsg->qm_Data?(*((int*)qMsg->qm_Data)):0);
  128.           printf("DataLen:      %lu\n", qMsg->qm_DataLen);
  129.           printf("ActualLen:    %lu\n", qMsg->qm_ActualLen);
  130.  
  131.           FreeQMessage(session, qMsg);
  132.         }
  133.      }
  134.      if (signals & SIGBREAKF_CTRL_F) ProcessDebugCommands(session);
  135.      if (signals & SIGBREAKF_CTRL_C) break;  /* Quit if CTRL-C pressed */
  136.   }
  137.   /* CleanExit() called here! */
  138. }
  139.